/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.credsoft.copcred.persistencia.dao.jpa;

import br.com.credsoft.copcred.model.vo.Menu;
import br.com.credsoft.copcred.model.vo.Usuario;
import br.com.credsoft.copcred.persistencia.dao.UsuarioDao;
import br.gov.caixa.gisutsa.framework.tapiocaframework.persistencia.dao.GenericCrudDaoPersistence;
import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.Query;

/**
 * Classe responsável por implementar o acesso a dados do Usuario utilizando a API JPA
 * @author Sales
 * @since 2009-07-11
 */
public class UsuarioDaoImpl extends GenericCrudDaoPersistence<Usuario> implements UsuarioDao {

    public List<Usuario> getByNome(String nomeUsuario) {
        Query query = this.entityManager.createQuery("SELECT us FROM Usuario us WHERE us.nome LIKE :nome");
        query.setParameter("nome", nomeUsuario);

        List<Usuario> usuarios = query.getResultList();

        return usuarios;
    }

    public Usuario getByLogin(String loginUsuario) {
        Query query = this.entityManager.createQuery("SELECT us FROM Usuario us JOIN FETCH us.empresa em WHERE us.login = :login");
        query.setParameter("login", loginUsuario);

        Usuario usuario = null;
        try {
            usuario = (Usuario) query.getSingleResult();
        } catch (NoResultException nre) {
            this.logger.warn("Usuario não localizado sob login: " + loginUsuario, nre);
        }

        return usuario;
    }

    public List<Menu> getMenuUsuario(Usuario usuario) {
        Query query = this.entityManager.createQuery("SELECT m FROM Menu m JOIN m.perfis AS p WHERE m.menuDependente is null AND p.id = :idPerfil ORDER BY m.ordem");
        query.setParameter("idPerfil", usuario.getPerfil().getId());

        List<Menu> menu = query.getResultList();
        
        this.entityManager.flush();
        this.entityManager.clear();
        
        for (Menu m : menu) {
            query = this.entityManager.createQuery("SELECT m FROM Menu m JOIN m.perfis AS p WHERE m.menuDependente = :menu AND p.id = :idPerfil ORDER BY m.ordem");
            query.setParameter("idPerfil", usuario.getPerfil().getId());
            query.setParameter("menu", m);
            m.setMenusVinculados(query.getResultList());
        }

        return menu;
    }
}
